﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.Cryptography;

namespace KoSoft
{
	public static class UtilSec
	{
		#region ABOUT SECURITY
		private static DESCryptoServiceProvider GetCryptoProvider()
		{
			string IV = "Servicep";
			string Key = "Servicep";
			DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
			provider.IV = ASCIIEncoding.ASCII.GetBytes(IV);//原文使用ASCIIEncoding.ASCII方法的GetBytes方法
			provider.Key = ASCIIEncoding.ASCII.GetBytes(Key);//建立加密对象的密钥和偏移量
			return provider;
		}
		/// <summary>
		/// RSA 加密
		/// </summary>
		/// <param name="strToEncrypt">加密字符串</param>
		/// <returns>加密后的字符串</returns>
		public static string Encrypto(string strToEncrypt)
		{
			DESCryptoServiceProvider des = GetCryptoProvider();

			byte[] inputByteArray = Encoding.Default.GetBytes(strToEncrypt);//把字符串放到byte数组中

			MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流　
			//定义将数据流链接到加密转换的流
			CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
			cs.Write(inputByteArray, 0, inputByteArray.Length);
			cs.FlushFinalBlock();
			//上面已经完成了把加密后的结果放到内存中去

			StringBuilder ret = new StringBuilder();
			foreach (byte b in ms.ToArray())
			{
				ret.AppendFormat("{0:X2}", b);
			}
			ret.ToString();
			return ret.ToString();
		}
		/// <summary>
		/// RSA 解密
		/// </summary>
		/// <param name="strToDecrypt">解密字符串</param>
		/// <returns>解密后的字符，即传递前的字符</returns>
		public static string Decrypto(string strToDecrypt)
		{
			//获取加密服务类
			DESCryptoServiceProvider des = GetCryptoProvider();
			byte[] inputByteArray = new byte[strToDecrypt.Length / 2];
			for (int x = 0; x < strToDecrypt.Length / 2; x++)
			{
				int i = (Convert.ToInt32(strToDecrypt.Substring(x * 2, 2), 16));
				inputByteArray[x] = (byte)i;
			}
			MemoryStream ms = new MemoryStream();
			CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
			cs.Write(inputByteArray, 0, inputByteArray.Length);
			cs.FlushFinalBlock();
			//建立StringBuild对象，createDecrypt使用的是流对象，必须把解密后的文本变成流对象
			StringBuilder ret = new StringBuilder();
			return System.Text.Encoding.Default.GetString(ms.ToArray());
		}
		#endregion
	}
}
